import tkinter as tk
from tkinter import ttk
import pyautogui
import threading
import time
import sys
import os


def resource_path(relative_path):
    """获取资源文件的绝对路径"""
    try:
        # PyInstaller创建临时文件夹，将路径存储在_MEIPASS中
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)


class MousePositionTracker:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("鼠标位置追踪器")
        self.root.geometry("600x350")  # 增大窗口尺寸以容纳更大二维码
        self.root.resizable(True, True)
        self.root.minsize(400, 120)  # 可选：设置最小尺寸

        # 设置窗口图标
        self.set_window_icon()

        # 设置窗口置顶
        self.root.attributes('-topmost', True)

        # 窗口居中显示
        self.center_window()

        # 坐标显示变量
        self.x_var = tk.StringVar(value="X: 0")
        self.y_var = tk.StringVar(value="Y: 0")

        # 闪烁提示相关变量
        self.tip_visible = True
        self.tip_flash_job = None

        # 创建界面元素
        self.create_widgets()

        # 控制变量
        self.tracking = False
        self.tracking_thread = None

        # 绑定快捷键
        self.root.bind('<Control-c>', self.copy_coordinates)
        self.root.bind('<space>', self.toggle_tracking)

        # 窗口关闭事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)

    def set_window_icon(self):
        """设置窗口图标"""
        try:
            # 尝试几种常见的图标文件名
            icon_files = ["app_icon.ico", "icon.ico", "mouse_tracker.ico"]

            for icon_file in icon_files:
                icon_path = resource_path(icon_file)
                if os.path.exists(icon_path):
                    self.root.iconbitmap(icon_path)
                    break
        except:
            # 如果图标加载失败，继续运行程序
            pass

    def center_window(self):
        """将窗口居中显示"""
        self.root.update_idletasks()
        width = self.root.winfo_width()
        height = self.root.winfo_height()
        x = (self.root.winfo_screenwidth() // 2) - (width // 2)
        y = (self.root.winfo_screenheight() // 2) - (height // 2)
        self.root.geometry(f'{width}x{height}+{x}+{y}')

    def create_widgets(self):
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 第一行：坐标显示
        coord_frame = ttk.Frame(main_frame)
        coord_frame.pack(fill=tk.X, pady=2)

        x_label = ttk.Label(coord_frame, textvariable=self.x_var, font=("微软雅黑", 9))
        x_label.pack(side=tk.LEFT, padx=(0, 15))

        y_label = ttk.Label(coord_frame, textvariable=self.y_var, font=("微软雅黑", 9))
        y_label.pack(side=tk.LEFT)

        # 第二行：坐标输入框标签和输入框
        coord_input_frame = ttk.Frame(main_frame)
        coord_input_frame.pack(fill=tk.X, pady=5)

        # 坐标位置标签
        coord_label = ttk.Label(coord_input_frame, text="坐标:", font=("微软雅黑", 9))
        coord_label.pack(side=tk.LEFT, padx=(0, 5))

        # 坐标输入框
        self.coord_entry = ttk.Entry(coord_input_frame, width=25, font=("微软雅黑", 9))
        self.coord_entry.pack(side=tk.LEFT)
        self.coord_entry.insert(0, "(0, 0)")

        # 第三行：按钮和快捷键提示
        button_frame = ttk.Frame(main_frame)
        button_frame.pack(fill=tk.X, pady=2)

        self.toggle_btn = ttk.Button(button_frame, text="开始追踪", command=self.toggle_tracking)
        self.toggle_btn.pack(side=tk.LEFT, padx=(0, 5))

        copy_btn = ttk.Button(button_frame, text="复制坐标", command=self.copy_coordinates)
        copy_btn.pack(side=tk.LEFT)

        # 快捷键提示
        hint_label = ttk.Label(button_frame, text="(空格:开始/停止, Ctrl+C:复制)",
                               font=("微软雅黑", 9), foreground="gray")
        hint_label.pack(side=tk.RIGHT)

        # 第四行：二维码和提示信息
        qr_frame = ttk.Frame(main_frame)
        qr_frame.pack(fill=tk.X, pady=(10, 0))

        # 加载二维码图像
        self.load_qr_code(qr_frame)

        # 打赏提示文本（支持闪烁效果）
        tip_text = "软件这么好用，您的打赏是我前进的动力，打赏1元也是您的心意，真诚的感谢您，祝您天天好运，财源滚滚。"
        self.tip_label = ttk.Label(qr_frame, text=tip_text,
                                   font=("微软雅黑", 12, "bold"),  # 增大字体大小
                                   foreground="gray",
                                   wraplength=250, justify="left")
        self.tip_label.pack(side=tk.LEFT, fill=tk.X, expand=True)

        # 启动提示文字闪烁效果
        self.start_tip_flash()

    def start_tip_flash(self):
        """启动提示文字闪烁效果"""
        self.flash_tip_text()

    def flash_tip_text(self):
        """实现提示文字闪烁效果"""
        if self.tip_visible:
            self.tip_label.configure(foreground="#FF4500")  # 橙红色，更醒目
            self.tip_visible = False
        else:
            self.tip_label.configure(foreground="gray")  # 灰色
            self.tip_visible = True

        # 每500毫秒切换一次颜色
        self.tip_flash_job = self.root.after(500, self.flash_tip_text)

    def load_qr_code(self, parent_frame):
        """加载二维码图像"""
        qr_loaded = False

        # 尝试几种常见的二维码文件名
        qr_files = ["qrcode.png", "qr.png", "donate_qr.png", "payment_qr.png"]

        for qr_file in qr_files:
            # 使用 resource_path 获取正确的文件路径
            full_path = resource_path(qr_file)
            if os.path.exists(full_path):
                try:
                    # 尝试加载PNG格式
                    qr_image = tk.PhotoImage(file=full_path)
                    # 调整图像大小为180x180像素
                    original_width = qr_image.width()
                    original_height = qr_image.height()
                    scale_factor = min(original_width, original_height) // 180
                    if scale_factor > 1:
                        qr_image = qr_image.subsample(scale_factor, scale_factor)
                    qr_label = ttk.Label(parent_frame, image=qr_image)
                    qr_label.image = qr_image  # 保持引用防止被垃圾回收
                    qr_label.pack(side=tk.LEFT, padx=(0, 10))
                    qr_loaded = True
                    break
                except:
                    continue

        # 如果PNG格式失败，尝试其他格式
        if not qr_loaded:
            try:
                # 尝试导入PIL来支持更多格式
                from PIL import Image, ImageTk
                for qr_file in ["qrcode.jpg", "qr.jpg", "donate_qr.jpg"]:
                    # 使用 resource_path 获取正确的文件路径
                    full_path = resource_path(qr_file)
                    if os.path.exists(full_path):
                        image = Image.open(full_path)
                        # 调整图像大小为180x180像素
                        image = image.resize((180, 180), Image.LANCZOS)
                        qr_image = ImageTk.PhotoImage(image)
                        qr_label = ttk.Label(parent_frame, image=qr_image)
                        qr_label.image = qr_image  # 保持引用防止被垃圾回收
                        qr_label.pack(side=tk.LEFT, padx=(0, 10))
                        qr_loaded = True
                        break
            except ImportError:
                pass  # PIL未安装
            except:
                pass  # 图像加载失败

        # 如果所有尝试都失败，显示占位符
        if not qr_loaded:
            qr_placeholder = ttk.Label(parent_frame, text="[二维码区域]",
                                       font=("微软雅黑", 9), foreground="gray",
                                       relief="solid", padding=40)  # 增大占位符
            qr_placeholder.pack(side=tk.LEFT, padx=(0, 10))

    def show_bubble_message(self, message, duration=1500):
        """显示气泡消息在鼠标位置"""
        # 创建顶层窗口作为气泡提示
        bubble = tk.Toplevel(self.root)
        bubble.title("")
        bubble.overrideredirect(True)  # 无边框窗口
        bubble.configure(bg="#4CAF50")  # 绿色背景表示成功

        # 如果是错误消息，使用红色背景
        if "失败" in message:
            bubble.configure(bg="#f44336")

        # 设置标签
        label = tk.Label(bubble, text=message, bg=bubble.cget('bg'), fg="white",
                         font=("微软雅黑", 9), padx=10, pady=5)
        label.pack()

        try:
            # 获取当前鼠标位置
            mouse_x, mouse_y = pyautogui.position()
            # 在鼠标位置附近显示气泡（稍微偏移一点避免完全遮挡鼠标）
            bubble_x = mouse_x + 10
            bubble_y = mouse_y - 30
        except:
            # 如果获取鼠标位置失败，则在屏幕中央显示
            bubble_x = self.root.winfo_screenwidth() // 2
            bubble_y = self.root.winfo_screenheight() // 2

        # 设置气泡位置
        bubble.geometry(f"+{bubble_x}+{bubble_y}")

        # 确保气泡窗口置顶
        bubble.attributes('-topmost', True)

        # 自动销毁
        bubble.after(duration, bubble.destroy)

    def track_mouse_position(self):
        """追踪鼠标位置的线程函数"""
        while self.tracking:
            try:
                x, y = pyautogui.position()
                self.x_var.set(f"X: {x}")
                self.y_var.set(f"Y: {y}")
                coord_text = f"({x}, {y})"

                # 更新输入框中的坐标
                self.coord_entry.delete(0, tk.END)
                self.coord_entry.insert(0, coord_text)

                time.sleep(0.05)  # 50ms更新一次
            except:
                break

    def toggle_tracking(self, event=None):
        """切换追踪状态"""
        if not self.tracking:
            self.tracking = True
            self.toggle_btn.config(text="停止追踪")
            self.tracking_thread = threading.Thread(target=self.track_mouse_position, daemon=True)
            self.tracking_thread.start()
        else:
            self.tracking = False
            self.toggle_btn.config(text="开始追踪")

    def copy_to_clipboard(self, text):
        """多种方法尝试复制到剪贴板"""
        try:
            # 方法1: 使用tkinter内置方法
            self.root.clipboard_clear()
            self.root.clipboard_append(text)
            self.root.update()
            return True
        except:
            pass

        try:
            # 方法2: 尝试导入pyperclip
            import pyperclip
            pyperclip.copy(text)
            return True
        except:
            pass

        return False

    def copy_coordinates(self, event=None):
        """复制当前坐标到剪贴板"""
        # 优先从输入框获取坐标值
        coordinates = self.coord_entry.get()

        if self.copy_to_clipboard(coordinates):
            # 显示气泡成功提示
            self.show_bubble_message("坐标已复制!")
        else:
            # 显示气泡错误提示
            self.show_bubble_message("复制失败!")

    def on_closing(self):
        """窗口关闭事件"""
        # 取消闪烁任务
        if self.tip_flash_job:
            self.root.after_cancel(self.tip_flash_job)

        self.tracking = False
        self.root.destroy()

    def run(self):
        """运行程序"""
        self.root.mainloop()


if __name__ == "__main__":
    app = MousePositionTracker()
    app.run()
